package com.icehelper.hades.base.exception;

/**
 * 程序错误码的实现标准。<br/>
 *
 * @author Leon Sun
 */
public interface IErrorCode {

  /**
   * 处理中最小code，处理中一般表示需要重试
   */
  int MIN_PROCESSING = 9000;

  /**
   * 处理中最大code，处理中一般表示需要重试
   */
  int MAX_PROCESSING = 9999;

  /**
   * 成功code的最小值
   */
  int MIN_SUCCESS = 10000;

  /**
   * 成功code的最大值
   */
  int MAX_SUCCESS = 19999;

  /**
   * 失败code的最小值
   */
  int MIN_FAILURE = 20000;

  /**
   * 系统错误code的最小值
   */
  int MIN_SYSTEM_ERROR = 90000;

  /**
   * 系统错误code的最大值
   */
  int MAX_SYSTEM_ERROR = 99999;

  int code();

  String msg();

  /**
   * 判断是否为成功
   */
  default boolean isSuccess() {
    return isSuccess(this.code());
  }

  /**
   * 判断是否为处理中
   */
  default boolean isProcessing() {
    return isProcessing(this.code());
  }

  /**
   * 判断是否为失败
   */
  default boolean isFailure() {
    return isFailure(this.code());
  }

  /**
   * 判断code是否相同
   */
  default boolean sameCode(IErrorCode errorCode) {
    return errorCode != null && sameCode(errorCode.code());
  }

  /**
   * 判断code是否相同
   */
  default boolean sameCode(Integer code) {
    return code != null && code == this.code();
  }

  /**
   * 判断 errorCode不为null且为成功
   */
  static boolean isSuccess(IErrorCode errorCode) {
    return errorCode != null && errorCode.isSuccess();
  }

  /**
   * 判断 errorCode为null<b>或者</b>处理中
   */
  static boolean isProcessing(IErrorCode errorCode) {
    return errorCode == null || errorCode.isProcessing();
  }

  /**
   * 判断 errorCode不为null且为失败
   */
  static boolean isFailure(IErrorCode errorCode) {
    return errorCode != null && errorCode.isFailure();
  }

  /**
   * 判断 errorCode不是null并且为系统未知错误，通常是未处理的系统异常
   */
  static boolean isSystemError(IErrorCode errorCode) {
    return errorCode != null && isSystemError(errorCode.code());
  }

  /**
   * 判断 code不为null且为成功
   */
  static boolean isSuccess(Integer code) {
    return code != null && MIN_SUCCESS <= code && code <= MAX_SUCCESS;
  }

  /**
   * 判断 code为null<b>或者</b>处理中
   */
  static boolean isProcessing(Integer code) {
    return code == null || (MIN_PROCESSING <= code && code <= MAX_PROCESSING);
  }

  /**
   * 判断 code不为null且为失败
   */
  static boolean isFailure(Integer code) {
    return code != null && code >= MIN_FAILURE;
  }

  /**
   * 判断是否为系统未知错误，通常是未处理的系统异常
   */
  static boolean isSystemError(Integer code) {
    return code != null && code >= MIN_SYSTEM_ERROR && code <= MAX_SYSTEM_ERROR;
  }

}
